package com.gofun.framework.dubbo.core.environment;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;

import com.alibaba.dubbo.common.utils.StringUtils;

/**
 * @Project       : framework-dubbo-core
 * @Program Name  : com.ljt.framework.dubbo.core.environment.AbstractResolveStrategy.java
 * @Description   : 用于解决环境变量同映射属性之间的转换
 * @Author        : wangchao
 * @Creation Date : 2016年5月29日 下午10:40:13 
 * @ModificationHistory  
 * Who          When             What 
 * ----------   -------------    -----------------------------------
 * wangchao     2016年5月29日        create
 */
public abstract class AbstractResolveStrategy implements ResolveMappingStrategy {
	
	protected final Logger logger = LoggerFactory.getLogger(getClass());
	
	/**
	 *  @Description	: 判断属性是否符合当前系统启动环境（系统启动环境：dev、test、prod）
	 *  @return         : boolean
	 *  @Creation Date  : 2016年5月29日 下午10:20:50 
	 *  @Author         : wangchao
	 */
	protected boolean isActivated(Environment env,ConfigMapping mapping){
		if(!doIsActivated(mapping,env.getProperty("spring.profiles"))){
			logger.info(mapping.getCode() + " skip,This configuration does not conform to the current environment");
			return false;
		}
		
		return true;
	}
	
	/**
	 *  @Description	: 当前环境该属性是否被激活
	 *  @return         : boolean
	 *  @Creation Date  : 2016年5月28日 下午12:18:06 
	 *  @Author         : wangchao
	 */
	protected boolean doIsActivated(ConfigMapping property,String level) {
		// 如果当前属性激活级别为all时,则符合所有的启动环境
		if(ConfigMapping.ALL_ACTIVATED.equals(property.getActivated()[0]))
			return true;
		// 如果当前启动环境参数为空时,则默认为dev
		level = StringUtils.isEmpty(level) ? ConfigMapping.DEV_ACTIVATED : level;
		for (String val : property.getActivated()) {
			if(val.equals(level))
				return true;
		}
		return false;
	}

}
